洛谷试炼场 2-7,2-8,2-9

DFS

八皇后

思路

只要把对角线的规律找出来就OK

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=998244353;
const int maxn=1e6+50;
const ll inf=0x3f3f3f3f3f3f3f3fLL;
int ans=0;
int h[1050],w[1050],le[1050],re[1050];
int n;
void print(){
ans++;
if(ans<=3){
for(int i=1;i<=n;i++){
if(i!=1)cout<<" ";
cout<<h[i];
}
cout<<endl;
}
}
void dfs(int id){
if(id>n){print();return;}
for(int i=1;i<=n;i++){
if(w[i]==0&&le[i+id]==0&&re[i-id+100]==0){
w[i]=1;
h[id]=i;
le[i+id]=1;
re[i-id+100]=1;
dfs(id+1);
w[i]=0;
h[id]=0;
le[i+id]=0;
re[i-id+100]=0;
}
}
}
int main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(0);
std::cout.tie(0);
cin>>n;
dfs(1);
cout<<ans<<endl;
return 0;
}

单词方阵

思路

找出第一个字符然后八个方向直线过去就行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=998244353;
const int maxn=1e6+50;
const ll inf=0x3f3f3f3f3f3f3f3fLL;
int dx[8]={1,-1,0,0,1,1,-1,-1};
int dy[8]={0,0,-1,1,1,-1,1,-1};
char ok[100]={'y','i','z','h','o','n','g'};
char s[150][150];
char ans[150][150];
int n;
bool check(int x,int y){
if(x<=n&&y<=n&&x>=1&&y>=1)return true;
else return false;
}
bool dfs(int x,int y,int id,int p){
if(id==6){ans[x][y]=ok[id];return true;}
int f=0;
for(int i=p;i<=p;i++){
int xx=x+dx[i],yy=y+dy[i];
if(check(xx,yy)&&s[xx][yy]==ok[id+1]){
if(dfs(xx,yy,id+1,p))ans[x][y]=ok[id],f=1;
}
}
if(f==1)return true;
else return false;
}
int main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(0);
std::cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++){
cin>>s[i]+1;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(s[i][j]=='y'){
for(int p=0;p<8;p++)
dfs(i,j,0,p);
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(ans[i][j])cout<<ans[i][j];
else cout<<'*';
}
cout<<endl;
}
return 0;
}

迷宫

比较水的题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=998244353;
const int maxn=1e6+50;
const ll inf=0x3f3f3f3f3f3f3f3fLL;
int dx[8]={1,-1,0,0,1,1,-1,-1};
int dy[8]={0,0,-1,1,1,-1,1,-1};
int n,m;
int mp[150][150];
int ans=0;
int sx,sy,ex,ey;
int vis[150][150];
bool check(int x,int y){
if(x<=n&&y<=m&&x>=1&&y>=1)return true;
else return false;
}
void dfs(int x,int y){
if(x==ex&&y==ey){
ans++;return;
}
vis[x][y]=1;
for(int i=0;i<4;i++){
int xx=x+dx[i],yy=y+dy[i];
if(check(xx,yy)&&mp[xx][yy]==0&&vis[xx][yy]==0){
dfs(xx,yy);
}
}
vis[x][y]=0;
}
int main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(0);
std::cout.tie(0);
int t;
cin>>n>>m;
cin>>t;
cin>>sx>>sy>>ex>>ey;
for(int i=1;i<=t;i++){
int a,b;
cin>>a>>b;
mp[a][b]=1;
}
dfs(sx,sy);cout<<ans<<endl;
return 0;
}

BFS

填图颜色

思路

把周围的0都涂完剩下的就是答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=998244353;
const int maxn=1e6+50;
const ll inf=0x3f3f3f3f3f3f3f3fLL;
int dx[8]={1,-1,0,0,1,1,-1,-1};
int dy[8]={0,0,-1,1,1,-1,1,-1};
int n,m;
int mp[150][150];
struct node{
int x,y;
};
bool check(int x,int y){
if(x<=n&&y<=n&&x>=1&&y>=1&&mp[x][y]==0)return true;
else return false;
}
void bfs(int x,int y){
queue<node>Q;
Q.push(node{x,y});
mp[x][y]=2;
while(!Q.empty()){
node now=Q.front();Q.pop();
for(int i=0;i<4;i++){
int xx=now.x+dx[i];
int yy=now.y+dy[i];
if(check(xx,yy)){
mp[xx][yy]=2;
Q.push(node{xx,yy});
}
}
}
}
int main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(0);
std::cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>mp[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if((i==1||j==1||i==n||j==n)&&(mp[i][j]==0)){
bfs(i,j);
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(mp[i][j]==0)cout<<"2";
else if(mp[i][j]==1)cout<<"1";
else if(mp[i][j]==2)cout<<"0";
if(j==n)cout<<endl;
else cout<<" ";
}
}
return 0;
}

01迷宫(联通块加速)

思路

格子太大查询太多直接暴力会超时,所以采用联通快加速

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=998244353;
const int maxn=1e6+50;
const ll inf=0x3f3f3f3f3f3f3f3fLL;
int dx[8]={1,-1,0,0,1,1,-1,-1};
int dy[8]={0,0,-1,1,1,-1,1,-1};
int n,m;
char mp[1100][1100];
int fa[1100*1100+50];
int value[1100*1100+50];
bool vis[1100][1100];
struct node{
int x,y;
char id;
};
bool check(int x,int y,char id){
if(x<n&&y<n&&x>=0&&y>=0&&(id!=mp[x][y]))return true;
else return false;
}
int find(int x){
return x==fa[x]?x:fa[x]=find(fa[x]);
}
void unite(int a,int b){
int aa=find(a),bb=find(b);
if(aa==bb)return;
if(aa<bb){
fa[bb]=aa;
value[aa]+=value[bb];
}
else fa[aa]=bb,value[bb]+=value[aa];
}
inline int ID(int x,int y){return x*n+y;};
void bfs(int x,int y){
queue<node>Q;
Q.push(node{x,y,mp[x][y]});
vis[x][y]=1;
while(!Q.empty()){
node now=Q.front();Q.pop();
for(int i=0;i<4;i++){
int xx=now.x+dx[i];
int yy=now.y+dy[i];
if(check(xx,yy,now.id)&&vis[xx][yy]==false){
unite(ID(x,y),ID(xx,yy));
vis[xx][yy]=1;
Q.push(node{xx,yy,mp[xx][yy]});
}
}
}
}
int main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(0);
std::cout.tie(0);
cin>>n>>m;
for(int i=0;i<n;i++)cin>>mp[i];
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
fa[i*n+j]=i*n+j;
value[i*n+j]=1;
}
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(!vis[i][j])bfs(i,j);
}
}
while(m--){
int a,b;
cin>>a>>b;
cout<<value[find(ID(a-1,b-1))]<<endl;
}
return 0;
}

马的遍历(水)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=998244353;
const int maxn=1e6+50;
const ll inf=0x3f3f3f3f3f3f3f3fLL;
int dx[8]={1,1,-1,-1,2,2,-2,-2};
int dy[8]={2,-2,2,-2,1,-1,1,-1};
int n,m;
bool vis[1100][1100];
int ans[450][450];
struct node{
int x,y,step;
};
bool check(int x,int y){
if(x<=n&&y<=m&&x>=1&&y>=1&&vis[x][y]==false)return true;
else return false;
}
void bfs(int x,int y){
queue<node>Q;
Q.push(node{x,y,0});
vis[x][y]=1;
while(!Q.empty()){
node now=Q.front();Q.pop();
ans[now.x][now.y]=now.step;
for(int i=0;i<8;i++){
int xx=now.x+dx[i];
int yy=now.y+dy[i];
if(check(xx,yy)){
vis[xx][yy]=1;
Q.push(node{xx,yy,now.step+1});
}
}
}
}
int main()
{
// std::ios::sync_with_stdio(false);
// std::cin.tie(0);
// std::cout.tie(0);
memset(ans,-1,sizeof(ans));
int sx,sy;
cin>>n>>m;
cin>>sx>>sy;
bfs(sx,sy);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
printf("%-5d",ans[i][j]);
}cout<<endl;
}
return 0;
}

带有技巧的搜索